﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.Dominio;
using Sistema.NFe.Xml.Versao200.Mapeamento;
using Sistema.NFe.Xml.Interfaces;
using Sistema.Util;

namespace Sistema.NFe.Xml.Versao200
{
    public class XMLInutilizaNFe200 : Sistema.NFe.Xml.Interfaces.IXmlInutilizacao
    {
        String _versao;
        TipoAmbiente _tipoAmbiente;
        String _id;
        long _protocolo;
        String _justificativaInutilizacao;
        cUF _cUF;
        String _serie;
        String _numeroFinal;
        String _numeroInicial;
        String _chaveNFe;
        String _CNPJ;
        String _mod;

        #region Propriedades

        public String Mod
        {
            get { return _mod; }
            set { _mod = value; }
        }

        public String CNPJ
        {
            get { return _CNPJ; }
            set { _CNPJ = value; }
        }
        public String ChaveNFe
        {
            get { return _chaveNFe; }
            set { _chaveNFe = value; }
        }

        public String NumeroInicial
        {
            get { return _numeroInicial; }
            set { _numeroInicial = value; }
        }
        public String NumeroFinal
        {
            get { return _numeroFinal; }
            set { _numeroFinal = value; }
        }

        public String Serie
        {
            get { return _serie; }
            set { _serie = value; }
        }
        public String Xml
        {
            get
            {
                return this.GeraXml();
            }
        }
        public String JustificativaInutilizacao
        {
            get { return _justificativaInutilizacao; }
            set { _justificativaInutilizacao = value; }
        }

        public long Protocolo
        {
            get { return _protocolo; }
            set { _protocolo = value; }
        }

        public String Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public TipoAmbiente TipoAmbiente
        {
            get { return _tipoAmbiente; }
            set { _tipoAmbiente = value; }
        }

        public String Versao
        {
            get { return _versao; }
            set { _versao = value; }
        }
        public cUF cUF
        {
            get { return _cUF; }
            set { _cUF = value; }
        }

        #endregion
        
        public String GeraXml()
        {
           TInutNFe dadosInut = new TInutNFe();
         
            this.ChaveNFe = this.ChaveInutilizacao();

            dadosInut.infInut = new TInutNFeInfInut();

            dadosInut.infInut.ano = DateTime.Now.ToString("yy");
            dadosInut.infInut.xServ = Mapeamento.TInutNFeInfInutXServ.INUTILIZAR;
            dadosInut.infInut.tpAmb = (Mapeamento.TAmb)((int)this.TipoAmbiente - 1);
            dadosInut.infInut.xJust = this.JustificativaInutilizacao;
            dadosInut.infInut.Id = this.ChaveNFe.Numeros().Insert(0, "ID");
            dadosInut.infInut.cUF = TCodUfIBGE.Item33; //(TCodUfIBGE) this.cUF;
            dadosInut.infInut.mod = TMod.Item55;
            dadosInut.versao = this.Versao;
            dadosInut.infInut.serie = this.Serie.Replace("0","");
            dadosInut.infInut.nNFFin = this.NumeroFinal;
            dadosInut.infInut.nNFIni = this.NumeroInicial;
            dadosInut.infInut.CNPJ = (String)new System.Configuration.AppSettingsReader().GetValue("CNPJ", typeof(String));


            System.Xml.Serialization.XmlSerializerNamespaces namespaces = new System.Xml.Serialization.XmlSerializerNamespaces();
            namespaces.Add("", "http://www.portalfiscal.inf.br/nfe");

            string xml = new Util.Serializacao().Serializar<Mapeamento.TInutNFe>(dadosInut, namespaces);
            return xml;
        }

        private String ChaveInutilizacao()
        {
            
            this.Mod = TMod.Item55.ToString();
            var Uf = (TCodUfIBGE)this.cUF;
            String chave = IdentificaXml.geraId(Uf.ToString(),this.Mod,this.Serie,this.NumeroInicial,this.NumeroFinal);
            return chave;
        }
    }
}
